﻿using System.Web;
using System.Data;
using System.Text;
using YookingCrypto.Class;
using YookingDBNormal.Class;
using YookingKitBox.Class.Public;
using YookingSvrDBCall.Class.DBLogic;

namespace YookingBizWQW.Class.Public
{
    public class clsHandleData
    {
        //注释：王庆文 2019年12月21日=========================================================
        /// <summary>
        /// 收到客户端的请求数据之后，先进行解密，然后进行中文解码操作。
        /// </summary>
        /// <param name="strB64RequestData">客户端传过来的BASE64格式的请求数据参数</param>
        /// <returns>返回解析后的明文解码结果</returns>
        public static string DeUrlRequest(string strB64RequestData)
        {
            string strRtData = "no data"; //最终的明文解码结果

            //先将客户端传过来的参数数据进行统一的转码和解密
            string strDeRequestData = clsBase64.Base64Decode(strB64RequestData);

            //客户端发起请求时为了兼容中文字符，因此做了两次转码，
            //所以服务器端也需要进行二次转码，将中文解析成正常显示。
            //strEnRequestData = HttpUtility.UrlEncode("张三丰");
            strRtData = HttpUtility.UrlDecode(strDeRequestData);

            return strRtData; //返回解析后的明文解码结果
        }

        //注释：王庆文 2019年12月21日=================================================================================
        /// <summary>
        /// 解析和处理客户端发过来的要求服务器必须处理的数据，
        /// 先解密、再解码、再解析出一个一个的参数，最后执行写库操作。
        /// </summary>
        /// <param name="strEnRequestData">
        /// 包含五个参数的数据集合，参数分别为：
        /// 【strDBGroup：数据库分组名】
        /// 【strDBTblName：库表名称】
        /// 【strKeyColSet：需要判断是否重值的字段名，支持可以多个字段】
        /// 【strUserName：客户端用户名】
        /// 【strJsonArray：将要向数据库中写入的真实数据内容】
        /// </param>
        /// <returns>返回最终insert或update的写库结果</returns>
        public string InsertOrUpdate_ToDB(string strB64RequestData)
        {
            string strRtData = "no data"; //最终的写库结果

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strDBGroup = "Data";         //数据库分组名
            string strDBTblName = "TableAA";    //库表名称
            string strKeyColSet = "aa,bb,cc";   //需要判断是否重值的字段名，支持可以多个字段
            string strUserName = "02120119901"; //客户端用户名
            string strJsonArray = "[{null}]";   //将要向数据库中写入的真实数据内容

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 5)
            {
                strDBGroup = strArray[0];
                strDBTblName = strArray[1];
                strKeyColSet = strArray[2];
                strUserName = strArray[3];
                strJsonArray = strArray[4];
            }

            #endregion
          
            DataSet dsData = clsJConvert.JArryToDataSet(strJsonArray); //将Json数组转成DataSet

            clsWriteDB myWrite = new clsWriteDB(); //先判断数据是否存在，根据判断结果自动执行insert或者update
            strRtData = myWrite.WriteDBNormal_UseSYSCol(strDBGroup, strDBTblName, strKeyColSet, strUserName, dsData);

            return strRtData; //数据库操作的最终结果
        }

        //注释：王庆文 2019年12月21日=========================================================
        /// <summary>
        /// 删除指定指定数据库表中指定Sys_RecordID的记录
        /// </summary>
        /// <param name="strB64RequestData">客户端传过来的BASE64格式的请求数据参数</param>
        /// <returns>返回数据库操作的结果，注销操作受影响的行数</returns>
        public string CancelDataForRecordID(string strB64RequestData)
        {
            object objResult = 0; //受影响的行数

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strDBGroup = "Data";   //数据库分组名
            string strDBTblName = "Test"; //库表名称
            string strCancelUserName = "02120119901"; //注销操作者
            string strCancelDateTime = "1900-01-01 00:00:00"; //注销日期时间值
            string strCancelReason = "未说明"; //注销原因
            string strRecordID = "0000000000"; //待注销的记录ID

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 6)
            {
                strDBGroup = strArray[0];
                strDBTblName = strArray[1];
                strCancelUserName = strArray[2];
                strCancelDateTime = strArray[3];
                strCancelReason = strArray[4];
                strRecordID = strArray[5];
            }

            #endregion

            #region 生成update记录的SQL语句

            StringBuilder sbUpdateSQL = new StringBuilder();
            sbUpdateSQL.AppendLine(" UPDATE " + strDBTblName + " SET ");
            sbUpdateSQL.AppendLine("  SYS_CANCELUSERNAME='" + strCancelUserName + "', ");
            sbUpdateSQL.AppendLine("  SYS_CANCELDATETIME='" + strCancelDateTime + "', ");
            sbUpdateSQL.AppendLine("  SYS_CANCELREASON='" + strCancelReason + "' ");
            sbUpdateSQL.AppendLine(" WHERE ");
            sbUpdateSQL.AppendLine("  SYS_RECORDID='"+ strRecordID + "' ");

            #endregion

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            objResult = myDB.YookingExecuteNonQuery(strDBGroup, sbUpdateSQL.ToString());

            return objResult.ToString(); //返回数据库操作的结果
        }

        //注释：王庆文 2020年03月25日==============================================
        //执行客户端提交过来的SQL语句，查询符合条件的记录信息
        public string SQL_ReadData(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strDBGroup = "Data"; //数据库分组名
            string strSQLText = "1=1";  //待执行的SQL语句

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 2)
            {
                strDBGroup = strArray[0];
                strSQLText = strArray[1];
            }

            #endregion

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            strRtData = myDB.YookingExecuteJson(strDBGroup, strSQLText);

            return strRtData; //数据库查询结果
        }

        //注释：王庆文 2020年03月25日==============================================
        //执行客户端提交过来的SQL语句，执行insert或者update操作
        public string SQL_WriteData(string strB64RequestData)
        {
            object objResult = 0; //受影响的行数

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strDBGroup = "Data"; //数据库分组名
            string strSQLText = "1=1";  //待执行的SQL语句

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 2)
            {
                strDBGroup = strArray[0];
                strSQLText = strArray[1];
            }

            #endregion

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            objResult = myDB.YookingExecuteNonQuery(strDBGroup, strSQLText);

            return objResult.ToString(); //返回数据库操作的结果
        }



    }
}
